#include<iostream>
#include<string>
#include<fstream> 
using namespace std;
#include "LinkStuList.h"

void op_user_menu(); 
void Register(LinkList &L); 
void Log_in(LinkList L); 
void Log_out(LinkList &L);
void Modify_Password(LinkList &L);
void File_in_List(LinkList &L); 
void List_out_file(LinkList L);
void PrintList(LinkList L);
// 主函数
int main() {
    LinkList L;
    int op;
    File_in_List(L); // 导入用户数据到表L
    while (true) {
        op_user_menu(); // 用户操作菜单
        cin >> op;
        switch (op) {
            case 1: // 输入1，注册功能
                Register(L); // 调用注册功能函数
                break;
            case 2:
                Log_in(L); // 输入2，登录功能，调用登录功能函数
                break;
            case 3: // 输入3，修改密码功能
                Modify_Password(L); // 调用修改密码功能函数
                break;
            case 4: // 输入4，注销用户功能
                Log_out(L); // 调用注销用户功能函数。
                break;
            case 5: // 输入5，显示所有用户信息
                PrintList(L); // 调用显示用户信息功能函数
                break;
            case 0: // 输入0，保存数据退出程序
                List_out_file(L); // 调用导出数据功能函数
                return 0;
            default:
                cout << "请输入正确的选项！" << endl;
        }
    }
    return 0;
}
// 将文件中的数据写入到L
void File_in_List(LinkList& L) {
    student e;
    fstream file;
    InitList_L(L);
    int i = 1;
    file.open("student.txt");
    if (!file) {
        cout << "错误！未找到文件！" << endl;
        exit(ERROR);
    }
    while (!file.eof()) {
        file >> e.num >> e.name >> e.major >> e.password;
        ListInsert_L(L, i, e);
        i++;
    }
    cout << "输入 student.txt 信息完毕" << endl << endl;
    file.close();
}

// 表L的数据写回文件student.txt
void List_out_file(LinkList L) {
    LNode* p;
    student e;
    fstream file("student.txt", fstream::out | ios_base::trunc); // 打开时清空文件
    if (!file) {
        cout << "错误！未找到文件！" << endl;
        exit(ERROR);
    }
    p = L->next;
    while (p->next) {
        e = p->data;
        file << left << e.num << "\t" << left << e.name << "\t" << left << e.major << "\t" << left << e.password << endl;
        p = p->next;
    }
    if (p) // 最后一个元素写入不要换行
    {
        e = p->data;
        file << left << e.num << "\t" << left << e.name << "\t" << left << e.major << "\t" << left << e.password;
    }

    file.close();
}

/// 用户操作菜单
void op_user_menu() {
    cout << endl;
    cout << "/***********************输入数字进行操作选择************************/" << endl;
    cout << "1.注册" << endl;
    cout << "2.登录" << endl;
    cout << "3.输入学号修改登录密码" << endl;
    cout << "4.输入学号进行账号注销" << endl;
    cout << "5.显示所有学生信息" << endl;
    cout << "0.保存并退出程序" << endl;
    cout << endl;
}

// 用户注册功能
void Register(LinkList& L) {
    student new_student;
    cout << "请输入学号: ";
    cin >> new_student.num;
    cout << "请输入姓名: ";
    cin >> new_student.name;
    cout << "请输入专业: ";
    cin >> new_student.major;
    cout << "请输入密码: ";
    cin >> new_student.password;
    ListInsert_L(L, 1, new_student); // 假设插入到表头
    cout << "注册成功！" << endl;
}

// 用户登录功能
void Log_in(LinkList L) {
    string num, password;
    cout << "请输入学号: ";
    cin >> num;
    cout << "请输入密码: ";
    cin >> password;
    LNode* p = LocateElem_P(L, num);
    if (p != nullptr && p->data.password == password) {
        cout << "登录成功！" << endl;
    } else {
        cout << "学号或密码错误，登录失败！" << endl;
    }
}

// 用户注销功能
void Log_out(LinkList& L) {
    string num;
    cout << "请输入要注销的学号: ";
    cin >> num;
    int pos = LocateElem(L, num);
    if (pos != 0) {
        ListDelete_L(L, pos);
        cout << "注销成功！" << endl;
    } else {
        cout << "未找到该学号，注销失败！" << endl;
    }
}

// 修改用户密码功能
void Modify_Password(LinkList& L) {
    string num, new_password;
    cout << "请输入要修改密码的学号: ";
    cin >> num;
    LNode* p = LocateElem_P(L, num);
    if (p != nullptr) {
        cout << "请输入新密码: ";
        cin >> new_password;
        p->data.password = new_password;
        cout << "密码修改成功！" << endl;
    } else {
        cout << "未找到该学号，无法修改密码！" << endl;
    }
}